/*--------------------------------------------------------------
 * File: devM26.h 编码类型：C语言  UTF-8
 * Author WRS (1352509846@qq.com)
 * 功能: 模拟的设备3(M26)功能
 * Version 0.1
 * Date 2024-11-18 
 * 
 * @copyright Copyright (c) 2024
 * 
----------------------------------------------------------------*/
#ifndef __DEVM26_H
#define	__DEVM26_H

#ifdef __cplusplus
extern "C" {
#endif
#include "stdio.h"
#include "stdint.h"
#include "esp_err.h"
#include "devPublic.h"

#define M26_DOChannel      6      // DO 通道个数
#define M26_DIChannel      14      // DI 通道个数
#define M26_AOChannel      2      // AO 通道个数
#define M26_AIChannel      4      // AI 通道个数

#define M26_DO_CH0     0x30
#define M26_DO_END     (M26_DO_CH0 + M26_DOChannel)
#define M26_DI_CH0     0x50
#define M26_DI_END     (M26_DI_CH0 + M26_DIChannel)
#define M26_AO_CH0     0x70
#define M26_AO_END     (M26_AO_CH0 + M26_AOChannel)
#define M26_AI_CH0     0x90
#define M26_AI_END     (M26_AI_CH0 + M26_AIChannel)



#define M26_MAX_NUM   6       // 26设备最大个数

extern char devM26_Name[20];

typedef struct
{
    DevSave_t dev_flag;             // 是否保存
    uint8_t devType;                // 设备类型
    uint16_t devLEDtime;            // 设备LED灯闪烁速度
    uint8_t dev_num;                // 设备个数
    uint8_t dev_index;              // 设备索引号
    uint8_t dev_SCRindex;       // 设备界面选择的设备地址索引号
    uint8_t devAddrNow;             // 当前选中的设备地址
    uint8_t dev_Addrindex;          // 当前选中的设备地址索引号
    uint8_t devAddrTemp;            // 临时地址
    Dev_state_t dev_state;          // 当前状态 
    uint8_t devAddr[M26_MAX_NUM];   // 设备地址       
    uint8_t dev_DO[M26_MAX_NUM][M26_DOChannel];     // 设备DO值
    uint8_t dev_DI[M26_MAX_NUM][M26_DIChannel];     // 设备DI值
    uint8_t dev_DI_state[M26_MAX_NUM];              // DI状态（红色0断开 绿色1闭合）
    uint16_t dev_AO[M26_MAX_NUM][M26_AOChannel];    // 设备AO值
    uint16_t dev_AOlast[M26_AOChannel];             // 上次设备AO值
    uint32_t dev_AI[M26_MAX_NUM][M26_AIChannel];    // 设备AI值
    uint32_t dev_AIlast[M26_AIChannel];             // 上次设备AI值
    Random_em dev_Random_mode[M26_MAX_NUM];         // 随机数模式

}__attribute__((packed)) m26_t;// 数据对齐：某些结构体在存储时可能会有数据对齐问题。可以使用 __attribute__((packed)) 来避免编译器对结构体进行对齐。
extern m26_t m26_info;

void m26_info_Init(void);
void devM26_Start(void);
void devM26_Stop(void);

void VARTable_RecVar_M26(uint32_t ctrl, uint8_t *pValue, void *pVarDes);
uint32_t VARTable_RecVarR_M26(uint32_t ctrl, uint8_t *pValue, void *pVarDes, uint8_t *devaddr);

#ifdef __cplusplus
}
#endif


#endif
